
//
//  WaterFallFlowLayout.m
//  瀑布流
//
//  Created by Jason on 2022/6/21.
//

#import "WaterFallFlowLayout.h"
#import "HomeFeedViewController.h"

//瀑布流的列数
static int columnCount = 2;
//瀑布流的内边距
static UIEdgeInsets defaultEdgeInsets = {5, 5, 5, 5};
//cell的列间距
static NSInteger columnMagin = 5;
//cell的行间距
static NSInteger rowMagin = 5;

@interface WaterFallFlowLayout ()
//存放全部cell 的布局属性
@property (nonatomic, strong) NSMutableArray * attrsArray;
//缩放全部列的高度
@property (nonatomic, strong) NSMutableArray * columnHeights;


@end

@implementation WaterFallFlowLayout

#pragma mark - 懒加载
- (NSMutableArray *)attrsArray {
    if (!_attrsArray) {
        _attrsArray = [NSMutableArray array];
    }
    return _attrsArray;
}

- (NSMutableArray *)columnHeights {
    if (!_columnHeights) {
        _columnHeights = [NSMutableArray array];
    }
    return _columnHeights;
}

#pragma mark - <准备布局>
//准备布局（布局前自动执行）
- (void)prepareLayout {
    //重写此方法必定要记得super
    [super prepareLayout];
    
    //在实际操做中咱们的数据并不会固定不变的，所以咱们每次布局前最好要清空以前存储的属性
    //清空存放全部列的高度
    //清空存放全部cell的布局属性
    [self.attrsArray removeAllObjects];
    [self.columnHeights removeAllObjects];
    
    //首先为第一行的cell附高度
    for (int i = 0; i < columnCount ; i++) {
        //数组里只能存放对象
        [self.columnHeights addObject:@(defaultEdgeInsets.top)];
    }
  //  NSLog(@"--columnHeights = %@",self.columnHeights);
    
    //下面开始建立每个cell的布局属性 而且添加到存储cell布局属性的数组中
    //cell总个数 由于这里只有一个section
    NSInteger itemCount = [self.collectionView numberOfItemsInSection:0];
    for (NSInteger i = 0; i < itemCount; i++) {
        // 建立位置 即indexPath
        NSIndexPath * indexPath = [NSIndexPath indexPathForItem:i inSection:0];
      //  NSLog(@"i = %ld, item = %ld",i, indexPath.item);
        //获取indexPath对应的cell布局属性
        UICollectionViewLayoutAttributes * attributes = [self layoutAttributesForItemAtIndexPath:indexPath];
      //  NSLog(@"attributes = %@",attributes);
        //把获取到的布局属性添加到数组中
        [self.attrsArray addObject:attributes];
    }
  //  NSLog(@"attrsArray = %@ - count = %ld",self.attrsArray, self.attrsArray.count);
   // NSLog(@"class = %@",[self.collectionView class]);
    //准备布局的工做到这里就结束了
}

//返回全部cell布局属性 及总体cell 的排布
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
    return self.attrsArray;
}

//返回cell 的布局属性
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{
    //建立布局属性
    UICollectionViewLayoutAttributes * attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    
    //获取collectionView 的宽
    CGFloat collectionViewWidth = self.collectionView.frame.size.width;
   // NSLog(@"%f", self.collectionView.frame.size.height);
   // NSLog(@"%f", self.collectionView.bounds.size.height);
    //下面的一部分是获取cell的frame（布局属性）
    CGFloat width;
    CGFloat height = 0.0;
    CGFloat X;
    CGFloat Y;
    //获取width
    width = (collectionViewWidth - defaultEdgeInsets.left - defaultEdgeInsets.right - (columnCount - 1) * columnMagin) / columnCount;
    //获取height
    //在实际开发中heigh并非真正的随机 而是根据数据来决定height 在这里展现初步的介绍其原理 所以采用大于100小于150的随机数
   // height = 100 + arc4random_uniform(50);
    if (self.itemHeightBlock) {
        height = self.itemHeightBlock(indexPath);
    }
    //获取X （瀑布流的实现重点就在cell的X，Y值获取）
    //设置一个列数的中间变量
    NSInteger tempColumn = 0;
    //设置高度小的中间变量 在这里咱们把第0列的高度给他，这样能够减小循环次数，提升效率
    CGFloat minColumnHeight = [self.columnHeights[0] doubleValue];
    for (NSInteger i = 1; i < columnCount; i ++) {
        if (minColumnHeight > [self.columnHeights[i] doubleValue]) {
            minColumnHeight = [self.columnHeights[i] doubleValue];
            tempColumn = i;
        }
    }
    X = defaultEdgeInsets.left + (width + columnMagin) * tempColumn;
    //获取Y
    Y = minColumnHeight;
    if (Y != defaultEdgeInsets.top) {
        Y += rowMagin;
    }
    //设置cell的frame
    attributes.frame = CGRectMake(X, Y, width, height);
    //更新高度最矮的那列的高度
    self.columnHeights[tempColumn] = @(CGRectGetMaxY(attributes.frame));
   // NSLog(@"height = %f, attributes.frame = %@, xxx = %f",height, @(CGRectGetMaxY(attributes.frame)), CGRectGetMaxY(attributes.frame) - height);
   // NSLog(@"self.columnHeights: %@", self.columnHeights);
    return attributes;
}

//返回collegeView的Content的大小
- (CGSize)collectionViewContentSize{
    //虽然说返回的是大小，可是咱们这里主要的是height
    CGFloat maxColumnHeight = [self.columnHeights[0] doubleValue];
  //  NSLog(@"columnHeights[0] = %f",[self.columnHeights[0] doubleValue]);
  //  NSLog(@"columnHeights[1] = %f",[self.columnHeights[1] doubleValue]);
  //  NSLog(@"-----maxColumnHeight = %f",maxColumnHeight);
    for (NSInteger i = 1; i < columnCount; i++) {

        CGFloat columnHeight = [self.columnHeights[i] doubleValue];
        
        if (maxColumnHeight < columnHeight) {
            maxColumnHeight = columnHeight;
        }
    }
   // NSLog(@"maxColumnHeight = %f",maxColumnHeight);
    return CGSizeMake(0, maxColumnHeight + defaultEdgeInsets.bottom);
    
}


@end
